package com.air.service.impl;

import com.air.constant.MessageConstant;
import com.air.dto.PassengerTicketPageQueryDTO;
import com.air.dto.TicketDTO;
import com.air.dto.TicketPageQueryDTO;
import com.air.entity.Ticket;
import com.air.exception.DeletionNotAllowedException;
import com.air.mapper.TicketMapper;
import com.air.result.PageResult;
import com.air.service.TicketService;
import com.air.vo.TicketVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;


@Service
public class TicketServiceImpl implements TicketService {

    @Autowired
    private TicketMapper ticketMapper;


    /**
     * 新增机票
     * @param ticketDTO
     */
    @Override
    public void save(TicketDTO ticketDTO) {
        // 创建一个Ticket实例，用于后续的数据填充和插入操作
        Ticket ticket = new Ticket();

        // 使用BeanUtils的copyProperties方法，将ticketDTO的对象属性值复制到ticket对象中
        // 这样做可以避免手动一一对应地设置属性，提高代码的可维护性和减少出错的可能性
        BeanUtils.copyProperties(ticketDTO,ticket);

        // 调用ticketMapper的insert方法，将填充完毕的ticket对象插入到数据库中
        // 这里体现了MVC架构中Model层与数据访问层的解耦，通过Mapper接口进行数据操作，提高了代码的模块化
        ticketMapper.insert(ticket);

    }

    /**
     * 分页查询机票
     * @param ticketPageQuery
     * @return
     */
    @Override
    public PageResult pageQuery(TicketPageQueryDTO ticketPageQuery) {
        // 开启分页
        PageHelper.startPage(ticketPageQuery.getPage(),ticketPageQuery.getPageSize());
        // 调用ticketMapper的pageQuery方法，进行分页查询
        Page<TicketVO> page = ticketMapper.pageQuery(ticketPageQuery);
        // 返回分页结果
        return new PageResult(page.getTotal(),page.getResult());
    }


    /**
     * 批量删除机票
     * @param ids
     */
    @Override
    public void deleteBatch(List<Long> ids) {
        //判断当前机票是否可以删除--机票状态为正常不能删除
        // 遍历待删除的机票ID列表
        for (Long id : ids) {
            // 根据ID查询机票信息
            Ticket ticket = ticketMapper.getById(id);
            // 检查机票状态，如果状态为2（表示机票正常），则不允许删除
            if (ticket.getStatus() == 2){
                throw new DeletionNotAllowedException(MessageConstant.TICKET_ON_OK);
            }
        }
        // 删除符合条件的机票
        ticketMapper.deleteBatch(ids);

    }

    /**
     * 根据id查询机票
     * @param id
     * @return
     */
    @Override
    public TicketVO getById(Long id) {
        // 根据id查询机票信息
       Ticket ticket = ticketMapper.getByIdWithFlight(id);
       // 将查询结果转换为TicketVO对象
       TicketVO ticketVO = new TicketVO();
       // 使用BeanUtils的copyProperties方法，将ticket对象属性值复制到ticketVO对象中
       BeanUtils.copyProperties(ticket,ticketVO);
       // 返回查询结果
       return ticketVO;
    }


    /**
     * 修改机票
     * @param ticketDTO
     */
    @Override
    public void update(TicketDTO ticketDTO) {
        // 创建一个Ticket实例，用于后续的数据填充和插入操作
        Ticket ticket = new Ticket();
        // 使用BeanUtils的copyProperties方法，将ticketDTO的对象属性值复制到ticket对象中
        BeanUtils.copyProperties(ticketDTO,ticket);
        // 调用ticketMapper的update方法，将填充完毕的ticket对象更新到数据库中
        ticketMapper.update(ticket);
    }

    /**
     * 修改机票状态
     * @param status
     * @param id
     */
    @Override
    public void startOrStop(Integer status, Long id) {
        // 根据提供的状态和ID构建一个新的Ticket对象
        // 这里采用Builder模式来确保对象的正确构造
        Ticket ticket = Ticket.builder()
                .status(status)
                .id(id)
                .build();

        // 调用ticketMapper的update方法来更新数据库中对应的票务信息
        // 该操作假设已经存在一个ticketMapper实例，负责与数据库交互
        ticketMapper.update(ticket);

    }

    /**
     * 根据航班id查询机票
     * @param flightId
     * @return
     */
    @Override
    public List<Ticket> list(Long flightId) {
        // 创建一个机票对象，用于查询条件
        // 只查询正常支付的机票
        Ticket ticket = Ticket.builder()
                .flightId(flightId) // 设置航班ID
                .status(2) // 设置机票状态为正常支付，状态码为2
                .build(); // 构建机票对象
        // 调用ticketMapper的list方法，根据构建的机票对象查询符合条件的机票列表
        return ticketMapper.list(ticket);

    }

    /**
     * 旅客分页查询
     * @param passengerTicketPageQueryDTO
     * @return
     */
    @Override
    public PageResult pageQueryByPassenger(PassengerTicketPageQueryDTO passengerTicketPageQueryDTO) {
        // 开启分页
        PageHelper.startPage(passengerTicketPageQueryDTO.getPage(),passengerTicketPageQueryDTO.getPageSize());
        // 调用ticketMapper的pageQueryByPassenger方法，进行分页查询
        Page<TicketVO> page = ticketMapper.pageQueryByPassenger(passengerTicketPageQueryDTO);
        // 返回分页结果
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 购买机票
     * @param ticketDTO
     */
    @Override
    public void purchase(TicketDTO ticketDTO) {
        // 创建一个Ticket实例，用于后续的数据更新操作
        Ticket ticket = new Ticket();

        // 将TicketDTO中的属性值复制到Ticket对象中，实现数据的初步同步
        BeanUtils.copyProperties(ticketDTO,ticket);

        // 设置Ticket的状态为2，表示已处理或已售出等状态
        ticket.setStatus(2);

        // 调用ticketMapper的update方法，更新数据库中对应Ticket记录的信息
        ticketMapper.update(ticket);

    }

    /**
     * 退票
     * @param id
     */
    @Override
    public void refund(Long id) {
        // 通过ID查询票务信息
        Ticket ticket = ticketMapper.getById(id);
        // 将票的状态设置为未支付
        if (ticket.getStatus() == 2){
            ticketMapper.refund(ticket);
        }

    }
}
